package processes

import (
	"fmt"
	"go_code/project01_basic/chapter15_qq/client/utils"
	"go_code/project01_basic/chapter15_qq/message"
	"io"
	"net"
	"os"
	"strings"
)

func ShowMenu() {
	for {
		fmt.Println("------  欢迎回来------")
		fmt.Println("------1. 显示在线用户列表------")
		fmt.Println("------2. 发送消息------")
		fmt.Println("------3. 发送文件------")
		fmt.Println("------4. 退出系统------")
		fmt.Println("请选择(1-4):")
		var key int
		fmt.Scanf("%d\n", &key)
		switch key {
		case 1:
			OutputOnlineUser()
		case 2:
			sms := &SmsProcess{}
			fmt.Println("1.群发消息")
			fmt.Println("2.私聊消息")
			fmt.Println("请选择(1-2):")
			smsType := 0
			fmt.Scanf("%d\n", &smsType)
			if smsType == 1 {
				sms.SendGroupMes()
			} else if smsType == 2 {
				fmt.Println("请输入私聊对象id:")
				id := 0
				fmt.Scanf("%d\n", &id)
				fmt.Println("进入私聊通道,输入`bye退出`结束私聊")
				err := sms.SendPrivateMes(id)
				for err == nil {
					err = sms.SendPrivateMes(id)
				}
				if err != nil && err != io.EOF {
					fmt.Println("SendPrivateMes err=", err)
				}
			}

		case 3:
			flePath := ""
			fmt.Println("请输入文件地址:")
			fmt.Scanf("%v\n", &flePath)
			flePath = strings.Replace(flePath, "\\", "/", -1)
			fmt.Println(flePath)
			up := &UserProcess{}
			up.SendFile(flePath)
		case 4:
			up := &UserProcess{}
			up.Offline()
			fmt.Println("退出系统")
			os.Exit(0)
		default:
			fmt.Println("你输入的选项不正确..")
		}
	}
}

//和服务器保持通讯
func serverProcessMes(conn net.Conn) {
	tf := &utils.Transfer{
		Conn: conn,
	}
	for {
		fmt.Println("...")
		mes, err := tf.ReadPkg()
		if err != nil {
			if err == io.EOF {
				fmt.Println("服务端关闭连接,客户端结束...")
				return
			}
			fmt.Println("tf.ReadPkg err=", err)
			return
		}

		switch mes.Type {
		case message.NotifyUserStatusMesType:
			UpdateUserStatus(mes)
		case message.SmsMesType:
			OutputGroupMse(mes)
		case message.SmsPrivateMesType:
			OutputPrivateMse(mes)
		case message.OfflineMesType:
			//下线就别通知了,把在线列表删除得了
			DeleteOfflineUser(mes)
		case message.FileMesType:
			up := &UserProcess{
				Conn: conn,
			}
			up.ReceiveFile(mes.Data)
		default:
			fmt.Println("服务器返回了未知消息类型")
		}
	}
}
